﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace GameCore
{
    // Class này quản lí các game state và chuyển mạch giữa các game state

    public class GameStateControl
    {
        // mảng các gamestate
        private static List<GameState> l_GameState = new List<GameState>();

        // Biến quản lí State
        private static bool EnterNextState = true;
        private static bool ExitCurrentState;

        // Chỉ số game state hiện tại
        static int  CurrentStateIndex;
        // ID gameState hiện tại
        private static int currentStateID;

        // add một gamestate vào mảng
        public static void AddGameState(GameState gs)
        {
            l_GameState.Add(gs);
        }

        // Lấy State hiện tại
        private static GameState GetGameState(int _gsId)
        {
            GameState _gs = l_GameState[CurrentStateIndex];

            if (_gsId != _gs.GAME_STATE_DEF)
            {
                for (int i = 0; i < l_GameState.Count; i++)
                {
                    _gs = l_GameState[i];
                    if (_gs.GAME_STATE_DEF == _gsId)
                    {
                        return _gs;
                        CurrentStateIndex = i;
                    }
                }
                return null;
            }
            return _gs;
        }

        // Chuyển State
        static void SwitchState(int stateID)
        {
            currentStateID = stateID;
            ExitCurrentState = true;
            EnterNextState = true;
        }

        // Send Message tới State
        static void SendMessage(GameTime gameTime,SystemMessage.StateMessage message)
        {
            GameState _gs = GetGameState(currentStateID);
            if (_gs != null)
            {
                _gs.StateHandler(gameTime, message, GlobalDefine.spriteBatch);

            }
            else 
                GlobalDefine.playing = false;

        }

        // Update
        public static void Update(GameTime gameTime)
        {
            
            if (EnterNextState)
            {
                GameStateControl.EnterNextState = false;
                GameStateControl.SendMessage(gameTime,SystemMessage.StateMessage.Enter);

            }

            GameStateControl.SendMessage(gameTime, SystemMessage.StateMessage.Update);

            if (GameStateControl.ExitCurrentState)
            {
                GameStateControl.SendMessage(gameTime,SystemMessage.StateMessage.Exit);
                GameStateControl.ExitCurrentState = false;
                GameStateControl.EnterNextState = true;
            }
        }
        public static void Render(GameTime gameTime)
        {
            GameStateControl.SendMessage(gameTime, SystemMessage.StateMessage.Render);
        }
        public static void SetNextGameState(int GS_ID)
        {
            SwitchState(GS_ID);
        }
    }
}
